package com.swa99ylum.pxf;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.swa99ylum.pxf.cell.CellFiller;
import com.swa99ylum.pxf.row.RowFiller;
import com.swa99ylum.pxf.sheet.SheetFiller;

public class Test4 {
	
	
	public static void main(String[] args) throws Exception {
		
		
		File file = new File("test5.xlsx");
		System.out.println(file.getAbsolutePath());
		
		
		FileInputStream fis = new FileInputStream(file);
		XSSFWorkbook xwb = new XSSFWorkbook(fis);
		
		/** ===================================================== */
		
		/** 正式使用 PluggableXSSFFiller */
		
		List<Student> sss = new ArrayList<>();
		sss.add(new Student(123, "张三", "上海", new Date(), "第一批"));
		sss.add(new Student(124, "李四", "北京", new Date(), "第一批"));
		sss.add(new Student(125, "王五", "四川", new Date(), "第二批"));
		sss.add(new Student(126, "赵六", "西安", new Date(), "第一批"));
		
		List<Student> sss2 = new ArrayList<>();
		sss2.add(new Student(441, "aaa", "上海", new Date(), "zzz"));
		sss2.add(new Student(442, "aaa123", "北京", new Date(), "zzxc"));
		sss2.add(new Student(443, "bbb", "四川", new Date(), "ttt"));
		sss2.add(new Student(444, "bbb456", "西安", new Date(), "qqq"));
		
		
		new PluggableXSSFFiller(xwb, new SheetFiller[] {
				new SheetFiller(new String[]{"Sheet1", "aaa"}, new RowFiller[] {
						new RowFiller(4, sss, new CellFiller[] {
								new CellFiller(3, new Object[]{"@{batch}", "@{id}", "@{name}", "@{address}", "-------"}),
								new CellFiller(null, new Object[]{"@{address}"}),
								new CellFiller(null, new Object[]{"@{birthDay}"}),
								
							/**
							 * 
							 * 一个 RowFiller 中，可能高度为 10
							 * 如果想要 合并单元格，必须 高度等于 10
							 * 不能说是，高度 2-5 合并，高度 7-9 合并，这样就需要定义 2 个 RowFiller  ？？？？？
							 * 
							 * pxp 不能像 pxf 一样 省略 beginIndex，因为 pxp 不知道 欲解析时的  宽度是 多少，而 pxf 则 可以通过 Object[] property 的  size 得到宽度信息
							 * 
							 * 
							 * 合并性的  injector：当发现 值一样时，会进行 合并单元格的操作，可以通过 cell之间的 协同（cell 的 值都一样），来 告诉 pxf 进行 "合并单元格"
							 */
								new CellFiller(2, new Object[]{"qwe", "qwe"}),
						}),
				}),
//				new SheetFiller(new String[]{"Sheet1", "aaa"}, new RowFiller[] {
//						new RowFiller(1, sss, new CellFiller[] {
//								new CellFiller(0, new Object[]{"@{batch}", "@{id}", "@{name}", "@{address}", "@{birthDay}"}),
//								new CellFiller(8, new Object[]{"@{address}"}),
//								new CellFiller(null, new Object[]{"@{birthDay}"}),
//						}),
//						new RowFiller(8, sss2, new CellFiller[] {
//								new CellFiller(0, new Object[]{777, "信息", "@{id}", "@{name}", "@{address}", "@{birthDay}"}),
//						})
//				}),
//				new SheetFiller(new String[]{"bbb"}, new RowFiller[] {
//						new RowFiller(4, Arrays.asList(new Object[5]), new CellFiller[] {
//								new CellFiller(0, new Object[]{"信息", "aaa", "111", 111, new Date(), 123555}),
//						})
//				}),
//				new SheetFiller(new String[]{"ccc1", "ccc2"}, new RowFiller[] {
//						new RowFiller(4, sss, new CellFiller[] {
//								new CellFiller(0, new Object[]{777, "信息", "@{name}", "@{@{name}}", "@{@{@{name}}}"}),
//								
//								/**
//								 * 
//								@{name}:		取 student 的 "name" 属性，如果 没有 "name" 属性，则报错
//								@{@{name}:		取 student 的 "@{name" 属性，如果 没有 "@{name" 属性，则报错
//								@{@{name}}:		取 纯文本 "@{name}"，不会把 他当做 属性名称，因为 "@{name}" 是 非法的 变量名，编译时会出错
//								@{@{@{name}}}:	取 纯文本 "@{@{name}}"
//								 */
//								
//						})
//				})
				
		})
		.fill();
		
		/** ===================================================== */
		
		FileOutputStream fo = new FileOutputStream(file);
		xwb.write(fo);
		fo.close();
		
	}


}
